package com.my.lambda;

/**
 * @author zhupanlin
 * @version 1.0
 * @description: TODO
 * @date 2024/2/4 9:32
 */

/**
 * 函数式接口，只要是函数式接口就可以用Lambda表达式简化
 * 函数式接口：接口中有且只有一个未实现的方法，这个接口就叫函数式接口
 */

@FunctionalInterface // 检查注解，帮我们快速检查我们写的接口是否式函数式接口
interface MyInterface{
    int sum(int i, int j);
}

interface A{
    void haha();
    default int sum(int i, int j){
        return i + j;
    }
}

// 1.自己写实现类
class MyInterfaceImpl implements MyInterface{

    @Override
    public int sum(int i, int j) {
        return i + j;
    }
}

public class Lambda {

    public static void main(String[] args) {
        // 1.自己创建实现类的对象
        MyInterface myInterface = new MyInterfaceImpl();
        System.out.println(myInterface.sum(1,2));
        
        // 2.创建匿名实现类
        MyInterface myInterface1 = new MyInterface() {
            @Override
            public int sum(int i, int j) {
                return i * i + j * j;
            }
        };
        System.out.println("myInterface1.sum(2 ,3) = " + myInterface1.sum(2, 3));
        // 冗余
        
        //3.lambda表达式:语法糖 参数列表 + 箭头 + 方法体
        MyInterface myInterface2 = (int i, int j) -> {
          return i + j;  
        };
        
        myInterface2.sum(1,2);
        
        // 完整写法如上:
        // 简化写法
        // 1). 参数类型可以不写，只写(参数名)，参数变量名随意定义；
        //     参数表最少可以只有一个()，或者只有一个参数名
        // 2). 方法体如果只有一句话，{} 可以省略
        
        A a = () -> {
            System.out.println("haha");
        };
        a.haha();
        
        A a2 = () -> System.out.println("hahahahaha");
        a2.haha();
        
        //以上lambda表达式简化了实例的创建
    }
    
}
